Wildfire · Burn Severity Mapping

dNBR – delta Normalized Burn Ratio

dNBR maps burn severity by comparing the Normalized Burn Ratio (NBR) before and after a fire event. It is one of the most widely used indices for wildfire impact assessment.

1. Scientific Definition

The Normalized Burn Ratio (NBR) uses NIR and SWIR2 to emphasize burnt areas:

NBR = (NIR − SWIR2) / (NIR + SWIR2)

The dNBR (delta NBR) is the difference between pre-fire and post-fire NBR:

dNBR = NBRpre − NBRpost

Interpretation (Typical USGS Classes)

  • < 0.1 → unburned / no change
  • 0.1 – 0.27 → low severity
  • 0.27 – 0.44 → moderate-low
  • 0.44 – 0.66 → moderate-high
  • > 0.66 → high burn severity

Applications

  • Wildfire damage and burn severity mapping
  • Post-fire recovery monitoring
  • Fuel and vegetation change assessment

2. Required Bands

Sentinel-2

  • NIR → B8
  • SWIR2 → B12

Landsat 8/9

  • NIR → B5
  • SWIR2 → B7

Suggested Palette (dNBR)

[ "#00441b", "#1a9850", "#ffffbf", "#fdae61", "#d73027", "#7f0000" ]

3. Google Earth Engine Code – dNBR (pre/post fire)


// dNBR – delta Normalized Burn Ratio
// NBR = (NIR - SWIR2) / (NIR + SWIR2)
// dNBR = NBR_pre - NBR_post

// AOI
var roi = geometry;
Map.centerObject(roi, 10);

// --------------------------
// 1. Define pre- and post-fire periods
// (Change dates according to your fire event)
// --------------------------
var preStart  = "2023-05-01";
var preEnd    = "2023-06-15";
var postStart = "2023-06-16";
var postEnd   = "2023-08-01";

// --------------------------
// 2. Load Sentinel-2 SR
// --------------------------
var s2 = ee.ImageCollection("COPERNICUS/S2_SR")
  .filterBounds(roi)
  .filter(ee.Filter.lt("CLOUDY_PIXEL_PERCENTAGE", 30))
  .select(["B8","B12"]); // NIR, SWIR2

var preCol = s2.filterDate(preStart, preEnd);
var postCol = s2.filterDate(postStart, postEnd);

var preImg = preCol.median().clip(roi);
var postImg = postCol.median().clip(roi);

// --------------------------
// 3. Compute NBR for pre and post
// --------------------------
function computeNBR(image){
  return image.normalizedDifference(["B8","B12"]).rename("NBR");
}

var nbrPre  = computeNBR(preImg).rename("NBR_pre");
var nbrPost = computeNBR(postImg).rename("NBR_post");

// --------------------------
// 4. Compute dNBR = NBR_pre - NBR_post
// --------------------------
var dnbr = nbrPre.subtract(nbrPost).rename("dNBR");

// --------------------------
// 5. Visualization
// --------------------------
var vis = {
  min: -0.5,
  max: 1.0,
  palette: [
    "#00441b", // unburned / regrowth
    "#1a9850",
    "#ffffbf", // low
    "#fdae61", // moderate
    "#d73027", // high
    "#7f0000"  // very high severity
  ]
};

Map.addLayer(dnbr, vis, "dNBR (Burn Severity)");

// Optional: mask only burned areas (e.g. dNBR > 0.1)
var burned = dnbr.gt(0.1).selfMask();
Map.addLayer(burned, {palette:["#d73027"]}, "Burned Area (dNBR > 0.1)", false);

// --------------------------
// 6. Export dNBR
// --------------------------
Export.image.toDrive({
  image: dnbr,
  description: "dNBR_export",
  fileNamePrefix: "dNBR_pre_" + preStart + "_post_" + postStart,
  region: roi,
  scale: 20,
  crs: "EPSG:4326",
  maxPixels: 1e13
});